<!DOCTYPE html>
<html lang="en">
<head>
    <meta  http-equiv="content-type" content="text/html" charset="utf-8"/>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        /**
         * 模拟extjs底层继承机制（非常完美的继承方式）
         * 混合继承做了3件事：继承了两次模板，继承了一次父类的原型对象
         */
        //父类
        function Person(name,age){
            this.name = name;
            this.age = age;
        }
        Person.prototype = {
            constructor:Person,
            sayHello:function(){
                alert('hello world!');
            }
        };
        //子类
        function Boy(sex,name,age){
            //call apply
            Boy.supClass.constructor.call(this,name,age);//1.借用构造函数继承:继承父类的模板
            this.sex = sex;
        }

        function extend(sub,sup){
            //目的：继承父类的原型对象
            //方法：用一个空函数进行中转
            var F = new Function();
            F.prototype=sup.prototype;
            sub.prototype=new F();
            sub.prototype.constructor=sub;//还原子类的构造器
            //保存父类的原型对象，方便解耦，方便获得父类原型对象
            sub.supClass = sup.prototype;
            //判断父类的原型对象的构造器（加保险）
            if(sup.prototype.constructor == Object.prototype.constructor){
                sup.prototype.constructor = sup;//手动还原父类原型对象的构造器
            }
        }
        //2.只继承一次父类的原型对象
        extend(Boy,Person);

        Boy.prototype.sayHello = function(){
            alert('hi javascript');
        }

        var b= new Boy(12,'aa','hhh');
        b.sayHello();
        Boy.supClass.sayHello.call(b);

    </script>
</head>
<body>

</body>
</html>